import datetime
from enum import Enum
from decimal import Decimal
from typing import Optional, List

from pydantic import BaseModel, ConfigDict, Field
from pydantic.types import UUID4

from app.schemas.archivable import Archivable


class MyEnum(str, Enum):
    enum1 = 'enum1'
    enum2 = 'enum2'
    enum3 = 'enum3'


class GroupBase(BaseModel):
    '''
    这是一个基类，用于定于基础模型
    '''
    demo1: Optional[int] = Field(None, description='可选参数')
    demo2: str = Field(description='必填参数')
    demo3: float = Field(3.14, description='默认值参数')
    demo4: Optional[bool] = Field(None)
    demo5: Optional[MyEnum] = Field(None)
    demo6: Optional[datetime.date] = Field(None)
    demo7: Optional[datetime.datetime] = Field(None)
    demo8: Optional[datetime.time] = Field(None)
    demo9: Optional[str] = Field(None)
    demo10: Optional[Decimal] = Field(None)
    demo11: Optional[dict] = Field(None)
    demo12: Optional[dict] = Field(None)
    demo13: Optional[str] = Field(None)


class GroupCreate(GroupBase):
    '''
    这个类用于接收通过API创建用户时传递的数据
    '''
    name: str = None
    users: List[UUID4] = []


class GroupUpdate(GroupBase):
    '''
    这个类用于接收通过API更新用户时传递的数据
    '''
    name: str = None
    users: List[UUID4] = []


class GroupBaseInDBBase(GroupBase):
    '''
    这个类用于定义用户在 数据库 中的基本模型
    '''
    # 这行代码的作用是配置DemoInDBBase类的model_config属性，以便将类的属性直接映射到实例的属性。
    model_config = ConfigDict(from_attributes=True)

    created_at: Optional[datetime.datetime] = Field(None)
    id: UUID4


class UserShare(BaseModel):
    email: str = None
    first_name: str = None
    id: UUID4 = None


class Group(GroupBaseInDBBase):
    '''
    这个类用于接收通过 API 返回的用户数据
    '''
    users: List[UserShare] = []


class GroupInDB(GroupBaseInDBBase, Archivable):
    '''
    这个类用于在数据库中存储用户数据
    '''
    pass
